/**
 * @file AppContext.h
 * @author w (w@163.com)
 * @brief 试验应用上下文
 * @version 0.1
 * @date 2024-04-26
 *
 * @copyright Copyright (c) 2024 xxxx公司
 *
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-04-26 <td>v1.0     <td>chen     <td>内容
 * </table>
 */
#ifndef APP_CONTEXT_H
#define APP_CONTEXT_H

#include <sstream>
#include <string>

#ifndef WRITE_MSG
/**
 * @brief 写日志宏
 *
 * @details
 */
#define WRITE_MSG(msg)                        \
	{                                         \
		std::stringstream ss;                 \
		ss << msg;                            \
		AppContex::Inst().WriteLog(ss.str()); \
	}
#endif // WRITE_LOG
/**
 * @brief 试验应用上下文类
 *
 * @details
 */
class AppContex {
public:
	/**
	 * @brief Destroy the App Contex object
	 *
	 * @details 细节1
	 */
	~AppContex();
	/**
	 * @brief 获取试验应用上下文静态实例
	 * @return AppContex& 试验应用上下文静态实例
	 *
	 * @details 细节2
	 */
	static AppContex& Inst();
	/**
	 * @brief  获取试验应用初始化标志
	 * @param [in] appFullPath  试验应用程序路径
	 * @return true 初始化成功
	 * @return false 初始化失败
	 *
	 * @details 细节3
	 */
	bool Init(std::string& appFullPath);
	/**
	 * @brief 获取试验应用名
	 * @return std::string 试验应用名
	 *
	 * @details
	 */
	std::string AppName();
	/**
	 * @brief 获取域名
	 * @return std::string 域名
	 *
	 * @details
	 */
	std::string DomainName();
	/**
	 * @brief 获取会话名
	 * @return std::string 会话名
	 *
	 * @details
	 */
	std::string SessionName();
	/**
	 * @brief 获取 kafka服务器ip
	 * @return std::string kafka服务器ip
	 *
	 * @details
	 */
	std::string KafkaBroker();
	/**
	 * @brief 获取试验应用恢复服务url
	 * @return std::string 试验应用恢复服务url
	 *
	 * @details
	 */
	std::string getExperiResumerUrl();
	/**
	 * @brief 获取心跳间隔时间
	 * @return int 心跳间隔时间
	 *
	 * @details
	 */
	int HeartbeatInterval();
	/**
	 * @brief 获取函数前缀
	 * @return std::string 函数前缀
	 *
	 * @details
	 */
	std::string FunctionPrefix();
	/**
	 * @brief 试验应用上下文日志记录
	 * @param [in] msg
	 *
	 * @details
	 */
	void WriteLog(std::string& msg);

protected:
	/**
	 * @brief ruct a new App Contex object
	 *
	 * @details
	 */
	AppContex();
	/**
	 * @brief 试验应用上下文日志初始化
	 * @param [in] argv0 试验应用程序绝对路径
	 *
	 * @details
	 */
	void InitLog(char* argv0);
	/**
	 * @brief 试验应用上下文日志对象销毁
	 *
	 * @details
	 */
	void DeinitLog();

private:
	static AppContex* m_pInst; ///< 试验应用上下文静态实例

	static CRecycle m_recycle; ///< 内置类静态对象
};

private:
bool m_isInitialized; ///< 试验应用上下文初始化标志
std::string m_strAppName; ///< 试验应用名称
std::string m_strDomain; ///< 试验域名
std::string m_strSession; ///< 会话
std::string m_strKafkaBroker; ///< kafka服务ip
int m_iHeartbeatInterval; ///< 心跳间隔
std::string m_strFunctionPrefix; ///< 状态初始化函数前缀
std::string m_experiResumerUrl; ///< 试验应用恢复url
}
;

#endif // APP_CONTEXT_H
